// @flow strict

export { validate } from './validate';

export { ValidationContext } from './ValidationContext';
export type { ValidationRule } from './ValidationContext';

// All validation rules in the GraphQL Specification.
export { specifiedRules } from './specifiedRules';

// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
export {
  FieldsOnCorrectType as FieldsOnCorrectTypeRule,
} from './rules/FieldsOnCorrectType';

// Spec Section: "Fragments on Composite Types"
export {
  FragmentsOnCompositeTypes as FragmentsOnCompositeTypesRule,
} from './rules/FragmentsOnCompositeTypes';

// Spec Section: "Argument Names"
export {
  KnownArgumentNames as KnownArgumentNamesRule,
} from './rules/KnownArgumentNames';

// Spec Section: "Directives Are Defined"
export {
  KnownDirectives as KnownDirectivesRule,
} from './rules/KnownDirectives';

// Spec Section: "Fragment spread target defined"
export {
  KnownFragmentNames as KnownFragmentNamesRule,
} from './rules/KnownFragmentNames';

// Spec Section: "Fragment Spread Type Existence"
export { KnownTypeNames as KnownTypeNamesRule } from './rules/KnownTypeNames';

// Spec Section: "Lone Anonymous Operation"
export {
  LoneAnonymousOperation as LoneAnonymousOperationRule,
} from './rules/LoneAnonymousOperation';

// Spec Section: "Fragments must not form cycles"
export {
  NoFragmentCycles as NoFragmentCyclesRule,
} from './rules/NoFragmentCycles';

// Spec Section: "All Variable Used Defined"
export {
  NoUndefinedVariables as NoUndefinedVariablesRule,
} from './rules/NoUndefinedVariables';

// Spec Section: "Fragments must be used"
export {
  NoUnusedFragments as NoUnusedFragmentsRule,
} from './rules/NoUnusedFragments';

// Spec Section: "All Variables Used"
export {
  NoUnusedVariables as NoUnusedVariablesRule,
} from './rules/NoUnusedVariables';

// Spec Section: "Field Selection Merging"
export {
  OverlappingFieldsCanBeMerged as OverlappingFieldsCanBeMergedRule,
} from './rules/OverlappingFieldsCanBeMerged';

// Spec Section: "Fragment spread is possible"
export {
  PossibleFragmentSpreads as PossibleFragmentSpreadsRule,
} from './rules/PossibleFragmentSpreads';

// Spec Section: "Argument Optionality"
export {
  ProvidedRequiredArguments as ProvidedRequiredArgumentsRule,
} from './rules/ProvidedRequiredArguments';

// Spec Section: "Leaf Field Selections"
export { ScalarLeafs as ScalarLeafsRule } from './rules/ScalarLeafs';

// Spec Section: "Subscriptions with Single Root Field"
export {
  SingleFieldSubscriptions as SingleFieldSubscriptionsRule,
} from './rules/SingleFieldSubscriptions';

// Spec Section: "Argument Uniqueness"
export {
  UniqueArgumentNames as UniqueArgumentNamesRule,
} from './rules/UniqueArgumentNames';

// Spec Section: "Directives Are Unique Per Location"
export {
  UniqueDirectivesPerLocation as UniqueDirectivesPerLocationRule,
} from './rules/UniqueDirectivesPerLocation';

// Spec Section: "Fragment Name Uniqueness"
export {
  UniqueFragmentNames as UniqueFragmentNamesRule,
} from './rules/UniqueFragmentNames';

// Spec Section: "Input Object Field Uniqueness"
export {
  UniqueInputFieldNames as UniqueInputFieldNamesRule,
} from './rules/UniqueInputFieldNames';

// Spec Section: "Operation Name Uniqueness"
export {
  UniqueOperationNames as UniqueOperationNamesRule,
} from './rules/UniqueOperationNames';

// Spec Section: "Variable Uniqueness"
export {
  UniqueVariableNames as UniqueVariableNamesRule,
} from './rules/UniqueVariableNames';

// Spec Section: "Values Type Correctness"
export {
  ValuesOfCorrectType as ValuesOfCorrectTypeRule,
} from './rules/ValuesOfCorrectType';

// Spec Section: "Variables are Input Types"
export {
  VariablesAreInputTypes as VariablesAreInputTypesRule,
} from './rules/VariablesAreInputTypes';

// Spec Section: "All Variable Usages Are Allowed"
export {
  VariablesInAllowedPosition as VariablesInAllowedPositionRule,
} from './rules/VariablesInAllowedPosition';
